//
// Created by ly-zhouxyi on 2024/3/5.
//

#ifndef FFMPEGPLAYER_VIDEODECODER_H
#define FFMPEGPLAYER_VIDEODECODER_H

#include "PlayStatus.h"
#include "FFmpegCallJava.h"
#include "DataQueue.h"
#include "AudioDecoder.h"


extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavutil/time.h"
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>
};


class VideoDecoder {
public:
    FFmpegCallJava *callJava = NULL;
    PlayStatus *playStatus = NULL;
    AVCodecContext *avCodecContext = NULL;
    AVCodecParameters *avCodecParameters = NULL;
    pthread_mutex_t codecMutex;
    pthread_t thread_video_play;
    int streamIndex = -1;  // 音频索引
    int sample_rate = 0;
    int duration = 0;
    AVRational time_base; // 时间单位         总时间/帧数   单位时间     *   时间戳= pts  * 总时间/帧数   h264    记录int  位数最小化   单位    帧率
    double clock;//当前播放的时间    准确时间
    double delayTime; // 已音频为主 的差值
    //    默认休眠时间   40ms  0.04s    帧率 25帧
    double defaultDelayTime = 0.04;
    AudioDecoder *audioDecoder = NULL;
    DataQueue *videoQueue = NULL;

    VideoDecoder(FFmpegCallJava *callJava, PlayStatus *playStatus);

    void play();

    void pause();

    void resume();

    void release();

    double getDelayTime(double diff);

    double getFrameDiffTime(AVFrame *avFrame);

    ~VideoDecoder();


};


#endif //FFMPEGPLAYER_VIDEODECODER_H
